/**
 * 通用设置
 * 后续组件如果在没有设置的情况下,优先关联通用设置
 */
import { Result } from "./result";
import { BoxShadowOpts, ColorOpts } from "./meta";
import { BgColorOpts } from "./theme.css/mock.type";
/**
 * 意图
 */
export interface IntentOpts {
  color?: {
    theme?: ColorOpts;
    primary?: ColorOpts;
    success?: ColorOpts;
    warning?: ColorOpts;
    danger?: ColorOpts;
    error?: ColorOpts;
    info?: ColorOpts;
  };
}

/**
 * 文本色彩
 */
export interface TextOpts {
  color?: {
    // 主文本色
    primary?: ColorOpts;
    // 常规色
    regular?: ColorOpts;
    // 辅助文字色
    secondary?: ColorOpts;
    // 占位符色
    placeholder?: ColorOpts;
    // 禁用色
    disabled?: ColorOpts;
  };
}

/**
 * 字体大小,单位像素
 */
export interface FontSizeOpts {
  // 超大字体
  extraLarge?: number;
  // 大号字体
  large?: number;
  // 中号字体
  medium?: number;
  // 基础字体
  base?: number;
  // 小号字体
  small?: number;
  // 超小字体
  extraSmall?: number;
}

/**
 * 字体
 */
export interface FontOpts {
  // 启用字体名称
  family?: string;
  // 字体大小定义
  size?: FontSizeOpts;
}

/**
 * 禁用
 */
export interface DisabledOpts {
  color?: {
    // 背景
    background?: ColorOpts;
    // 文字
    text?: ColorOpts;
    // 边框
    border?: ColorOpts;
  };
}

/**
 * 组件阴影设置
 */
export interface ComponentShadowOpts {
  // 基础
  base?: BoxShadowOpts;
  // 浅
  light?: BoxShadowOpts;
  // 更浅
  lighter?: BoxShadowOpts;
  // 深
  dark?: BoxShadowOpts;
}

/**
 * 遮罩
 */
export interface MaskOpts {
  color?: ColorOpts;
}

/**
 * 主题定义配置
 */
export interface ThemeOpts {
  // 意图
  intent?: IntentOpts;
  // 文本
  text?: TextOpts;
  // 字体设置
  font?: FontOpts;
  // 遮罩层颜
  mask?: MaskOpts;
  // 禁用
  disabled?: DisabledOpts;
  // 阴影设置
  shadow?: ComponentShadowOpts;
  bg?: BgColorOpts;
}

/**
 * 主题功能接口
 */
export interface Theme {
  /**
   * 主题变量Map形式
   * 没有设置项目将返回空字符串
   */
  variableMap(): Map<string, string>;
  /**
   * 主题变量string形式
   * split:分隔符,默认使用";\n"进行变量之间的分割
   */
  variableString(split?: string): string;
  /**
   * 设置属性值
   */
  setVariable(name: string, value: string): Result;
  /**
   * 获得属性值
   */
  getVariable(name: string): string;
}
